#include <iostream>
using namespace std;
/*
    命令模式
    动机 ： 我们经常需要向某些对象发送请求，但是不知道请求的接收者是谁，
           也不知道请求的操作是哪个，我们只需在程序运行时指定具体的请求接收者即可。
    命令模式可以对发送者和接收者完全解耦。
*/
class Receiver{
    // 接收者
    public:
    void Action(){
        cout << "Receiver::Action..."<< endl;
    }
};

class Command{
    // 抽象命令类
    public:
    virtual ~Command() { }
    virtual void Excute() = 0;
};

class ConcreteCommand : public Command{
    // 具体命令类
    public:
    ConcreteCommand(Receiver *rev){
        _rev = rev;
    }
    void Excute(){
        _rev->Action();
    }
    private:
    Receiver *_rev;
};

class Invoker{
    // 调用者
public:
    Invoker(Command *cmd){
        _cmd = cmd;
    }
    void Invoke(){
        _cmd->Excute();
    }
private:
    Command *_cmd;
};

int main(){
    Receiver *rev = new Receiver();
    Command *cmd = new ConcreteCommand(rev);
    Invoker *inv = new Invoker(cmd);
    inv->Invoke();

    delete rev;
    delete cmd;
    delete inv;
    return 0;
}